<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // ES6: ECMA 2015 ，标准 js的版本
      // ECMA : 计算机协会
      // ES6的更新 ；
      // 一.let 及 const
      // 1.let ：出现是为了替代  var 声明变量；
      // var a = 10;
      // let b = 20;
      // console.log(a,b);
      // let 和 var的区别 ？
      // 1.let 不能被重复声明 ；
      // let a = 10;
      // let a = 20;
      // console.log(a);

      // var a = 10;
      // var a = 20;
      // console.log(a);
      // 2.let 声明的变量 会被放在暂时性死区里； 不会被挂载在window上；
      // var a = 10;
      // console.log(window.a);
      // let a = 10;
      // console.log(window.a);

      // 3.let 支持 块级作用域 var 不支持块级作用域；
      // 全局作用域  局部作用域（1.函数作用域 2.块级作用域）;
      // 声明块级作用域  { };
      // {
      //     // 块级作用域；
      //     let a = 10;
      //     var b = 20;
      //     console.log(a);
      // }
      // // console.log(a);
      // console.log(b);
      // {
      //     let a = 20;
      //     console.log(a);

      // }

      // 循环生成块级作用域；
      // for(let i=0;i<3;i++){

      // }

      // 4.let 没有 hositing（声明前置 ，预解析）;
      // var a;
      // console.log(a);
      // a = 10;
      // console.log(a);
      // let a = 10;

      // const 声明常量 ： 常量 一旦声明之后就不能被重新赋值
      // const NAME = "张三";
      // const NAME = "李四";
      // NAME = "李四";
      // const PI = "3.1415926";
      // const hello = "你好";
      // console.log(PI,hello);
      // 1.没有申明前置 2.不会挂载window上，临时性死区 3.支持块级作用域  4.不能被重复声明，且不能被重新赋值；

      // const 声明对象；
      // const obj = {
      //     name:"张三",
      //     age:20
      // }
      // // obj = {
      // //     name:"李四",
      // //     age:21
      // // }
      // obj.name = "李四";
      // console.log(obj);

      // 想要不可变的对象；Object.freeze()来冻结对象
      // Object.freeze: 只能冻结最外层对象 ，不能深层次冻结对象；
      const obj = {
        name: "张三",
        age: 20,
        obj2: {
          height: "178cm",
        },
      };

      //   Object.freeze(obj);
      deepFreeze(obj);
      // console.log(newObj)
      obj.name = "李四";
      // obj.age = 22;
      obj.obj2.height = "180cm";

      console.log(obj);

      // 冻结深层次的对象
      function deepFreeze(obj) {
        Object.freeze(obj);
        for (let key in obj) {
          if (typeof obj[key] === "object") {
            deepFreeze(obj[key]);
          }
        }
      }
    </script>
  </body>
</html>
